package com.example.ruitong.dao;

import com.example.ruitong.entity.Account;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

//自定义借口继承接口JpaRepository
//注意JpaRepository有两个泛型，前者是具体操作的对象实体，也就是对应的表，后者是ID的类型
@Repository
public interface AccountRepository extends JpaRepository<Account, Integer> {

    //自定义查询：模糊查询
    //注意自定义方法：要想被JPA猜对，注意使用驼峰命名规则，这里的like，首字母L要大写
    public List<Account> findAllByUsernameLike(String username);

    //同时根据用户名和ID一起查询：
    public List<Account> findByIdAndUsername(int id,String username);

    //判断数据库中是否存在某个ID的用户：
    boolean existsAccountById(int id);

    /**
     * 不使用方法名称拼接,自由度更高
     *
     * 但要注意：当我们要通过自已写的更新、插入、删除SQL语句来实现更新、插入、删除操作时，至少需要用两个步骤：
     * 1.@Query来注入我们自定义的sql；
     * 2.使用@Modifying来标注是一个更新类的自定义语句。
     */
    //自定义SQL语句必须在事务环境下运行 必须有DML支持(Modifying)
    //这里用到的?可以起到防止SQL注入的问题
    // ?2表示下面的形参的第二个位置 这里不对表进行操作 直接对实体类进行操作 然后实体类映射到表中
    @Transactional//这个注解也可以加到测试类上面 但需要跟进一个@commit提交事务的注解 因为测试类会自动回滚事务
    @Modifying
    @Query("update Account set password=?2 where id=?1")
    int updatePasswordById(int id,String newPassword);

    //当然要是自定义sql语句看着不习惯,也可以使用原生sql语句,也就是对表进行操作
    @Modifying
    @Query(value = "update account set password=?2 where name=?1",nativeQuery = true)//开启原生SQL
    @Transactional
    int updatePasswordByUsername(String username,String password);



}
